package com.magictower.primary.utils;

import java.io.File;
import java.io.FileInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils {

    /**
     * md5加密
     *
     * @param password 密码
     * @return
     */
    public static String encode(String password) {
        try {
            MessageDigest instance = MessageDigest.getInstance("MD5");// 获取MD5算法对象
            byte[] digest = instance.digest(password.getBytes());// 对字符串加密,返回字节数组
            StringBuffer sb = new StringBuffer();
            for (byte b : digest) {
                int i = b & 0xff;// 获取字节的低八位有效值
                String hexString = Integer.toHexString(i);// 将整数转为16进制
                if (hexString.length() < 2) {
                    hexString = "0" + hexString;// 如果是1位的话,补0
                }
                sb.append(hexString);
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            // 没有该算法时,抛出异常, 不会走到这里
        }
        return "";
    }

    /**
     * 获取到文件的MD5(病毒特征码)
     *
     * @param sourceDir 目录
     * @return 主动防御
     */
    public static String getFileMD5(String sourceDir) {
        File file = new File(sourceDir);
        try {
            //文件输出流
            FileInputStream fis = new FileInputStream(file);
            byte[] buffer = new byte[1024];
            //获取MD5数据摘要
            MessageDigest md = MessageDigest.getInstance("md5");
            int len;
            //从输出流中读取文件至buffer中
            while ((len = fis.read(buffer)) != -1) {
                //buffer加载至数据摘要中
                md.update(buffer, 0, len);
            }
            //数据摘要生成16位的字节
            byte[] res = md.digest();
            /*
            1.分析字节只有1位则前面填充0
            2.连接此字节数组生成MD5串
             */
            StringBuilder sb = new StringBuilder();
            for (byte b : res) {
                int number = b & 0xff;//加盐+1 获取字节的低八位有效值
                String hex = Integer.toHexString(number);
                if (hex.length() == 1) {
                    hex = "0" + hex;
                }
                sb.append(hex);
            }
            fis.close();
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            System.out.println("算法异常");
            e.printStackTrace();
        } catch (java.io.IOException e) {
            System.out.println("IO异常");
            e.printStackTrace();
        }
        return null;
    }
}
